home *** CD-ROM | disk | FTP | other *** search
-
- /* Generated by Interface Builder */
-
- #import "FormatHandler.h"
- #import "Plot.h"
- #import "PlotView.h"
- #import "defs.h"
- #import <appkit/OpenPanel.h>
- #import <appkit/SavePanel.h>
- #import <appkit/Panel.h>
- #import <streams/streams.h>
- #import <strings.h>
- #import <appkit/color.h>
- #import <appkit/NXColorWell.h>
- #import <appkit/Button.h>
-
- @implementation FormatHandler
-
- // This is an attempt to get around an infinite loop that could otherwise result
- // when we try to read in an "old" format file with the "new" program.
- int cautious_read(NXStream *formatStream)
- {
- int i;
-
- while(YES) {
- i = NXGetc(formatStream);
- if (i == ':') return 0; /* good */
- if (i == EOF) {
- NXRunAlertPanel("Format File Read",
- "Unexpected end of file while reading format file\n"
- "(Perhaps you tried to read in an \"old\" format file)",
- "OK", NULL, NULL);
- return 1;
- }
- }
- }
-
- - writeFormatData:(NXStream *)formatStream
- {
- id font;
- int ncurves = [plotParam nCurvesTotal], i;
- NXPoint point;
- NXRect windowframe;
- float r, g, b, a;
- NXColor aColor;
-
- NXPrintf(formatStream, "xmin xmax xinc: %g %g %g\n", [plotParam provideXmin],
- [plotParam provideXmax], [plotParam provideXinc]);
- NXPrintf(formatStream, "ymin ymax yinc: %g %g %g\n", [plotParam provideYmin],
- [plotParam provideYmax], [plotParam provideYinc]);
- NXPrintf(formatStream, "xaxis: %s\n", [plotParam xaxisLog]? "log" : "linear");
- NXPrintf(formatStream, "yaxis: %s\n", [plotParam yaxisLog]? "log" : "linear");
-
- NXPrintf(formatStream, "Main title: %s\n", [mainTitle stringValueAt:0]);
- NXPrintf(formatStream, " Font and size: ");
- font = [canvas provideMainTitleFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica 14.0\n");
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
- point = [canvas provideMainTitleBoxOrigin];
- NXPrintf(formatStream, " main title box origin: %f %f\n", point.x, point.y);
-
- NXPrintf(formatStream, "X title: %s\n", [xTitle stringValueAt:0]);
- NXPrintf(formatStream, " Font and size: ");
- font = [canvas provideXTitleFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica %f\n", DEFAULTFONTSIZE);
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
- point = [canvas provideXTitleBoxOrigin];
- NXPrintf(formatStream, " x-title box origin: %f %f\n", point.x, point.y);
-
- NXPrintf(formatStream, "Y title: %s\n", [yTitle stringValueAt:0]);
- NXPrintf(formatStream, " Font and size: ");
- font = [canvas provideYTitleFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica %f\n", DEFAULTFONTSIZE);
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
- point = [canvas provideYTitleBoxOrigin];
- NXPrintf(formatStream, " y-title box origin: %f %f\n", point.x, point.y);
-
- NXPrintf(formatStream, "Legend on/off: %d\n", [legendOnOff state]);
- NXPrintf(formatStream, "Legend Box on/off: %d\n",
- [legendBoxOnOff state]);
- NXPrintf(formatStream, "Legend title: %s\n", [legendTitle stringValueAt:0]);
- NXPrintf(formatStream, " Font and size: ");
- font = [canvas provideLegendTitleFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica %f\n", DEFAULTFONTSIZE);
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
-
- NXPrintf(formatStream, "Legend font and size: ");
- font = [canvas provideLegendFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica %f\n", DEFAULTFONTSIZE);
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
-
- NXPrintf(formatStream, "No. of curves: %d\n", ncurves);
- NXPrintf(formatStream, "Curve No. Line type Symbol type"
- " Color (R,G,B,A) Title\n");
- for (i = 0; i < ncurves; i++) {
- aColor = [plotParam provideCurveColor:i];
- /* Convert to RGB for the sake of getting something human-readable */
- NXConvertColorToRGBA(aColor, &r, &g, &b, &a);
- NXPrintf(formatStream, "%4d %8d %10d %f %f %f %f %18s\n", i+1,
- [plotParam providelinestyle:i], [plotParam providesymbolstyle:i],
- r, g, b, a, [legendForm stringValueAt:i]);
- }
-
- NXPrintf(formatStream, "Line thickness: %f\n", [lineThicknessText floatValue]);
- NXPrintf(formatStream, "Symbol size: %f\n", [symbolSizeText floatValue]);
-
- NXPrintf(formatStream, "Grid on/off: %d\n", [gridOnOff state]);
- NXPrintf(formatStream, "Grid dotted: %d\n", [gridDotted state]);
- NXPrintf(formatStream, "Grid thickness: %f\n", [gridThicknessText floatValue]);
-
- NXPrintf(formatStream, "Border box on/off: %d\n",
- [borderBoxOnOff state]);
- NXPrintf(formatStream, "Border box thickness: %f\n",
- [borderBoxThicknessText floatValue]);
-
- NXPrintf(formatStream, "Frame box on/off: %d\n",
- [frameBoxOnOff state]);
- NXPrintf(formatStream, "Frame box thickness: %f\n",
- [frameBoxThicknessText floatValue]);
-
- NXPrintf(formatStream, "Axes on/off: %d\n", [axesOnOff state]);
- NXPrintf(formatStream, "Axis thickness: %f\n", [axisThicknessText floatValue]);
-
- NXPrintf(formatStream, "Tic label font and size: ");
- font = [canvas provideTicLabelFont];
- if (font == NULL)
- NXPrintf(formatStream, "Helvetica %f\n", DEFAULTFONTSIZE);
- else
- NXPrintf(formatStream, "%s %f\n", [font name], [font pointSize]);
-
- NXPrintf(formatStream, "Major tic marks on/off: %d\n",
- [majorTicMarksOnOff state]);
-
- NXPrintf(formatStream, "Minor tic marks on/off: %d\n",
- [minorTicMarksOnOff state]);
-
- NXPrintf(formatStream, "Tic mark length: %f\n",
- [ticMarkLengthText floatValue]);
-
- NXPrintf(formatStream, "Tic mark thickness: %f\n",
- [ticMarkThicknessText floatValue]);
-
- if (strncmp([ticMarkLocation title], "Axes", 4) == 0)
- i = 0;
- else if (strncmp([ticMarkLocation title], "Frame (2 sides)", 15) == 0)
- i = 1;
- else
- i = 2;
- NXPrintf(formatStream, "Tic mark location: %d\n", i);
-
- point = [canvas provideLegendBoxOrigin];
- NXPrintf(formatStream, "Legend box origin: %f %f\n", point.x, point.y);
-
- [canvas provideWindowFrame:&windowframe];
- NXPrintf(formatStream, "Window origin and size: %f %f %f %f\n",
- windowframe.origin.x, windowframe.origin.y,
- windowframe.size.width, windowframe.size.height);
- aColor = [plotParam provideTextColor];
- NXConvertColorToRGBA(aColor, &r, &g, &b, &a);
- NXPrintf(formatStream, "Text color (r, g, b, a): %f %f %f %f\n",
- r, g, b, a);
- aColor = [plotParam provideBackgroundColor];
- NXConvertColorToRGBA(aColor, &r, &g, &b, &a);
- NXPrintf(formatStream, "Background color (r, g, b, a): %f %f %f %f\n",
- r, g, b, a);
-
- // Following is new for error bars:
- NXPrintf(formatStream, "Error bar base width: %f\n",
- [ebarBaseWidthText floatValue]);
-
- // Following is new (placed here for backward compatibility)
- NXPrintf(formatStream, "Legend transparency: %d\n", [legendOpaque state]);
-
- return self;
- }
-
- #define READ_ONE_INT(x) if (cautious_read(formatStream) != 0) return self;\
- NXScanf(formatStream, "%d\n", &x);
-
- #define READ_ONE_FLOAT(x) if (cautious_read(formatStream) != 0) return self;\
- NXScanf(formatStream, "%f\n", &x);
-
- #define READ_STRING(s) if (cautious_read(formatStream) != 0) return self; \
- while (NXGetc(formatStream) == ' ') \
- ; /* throw away spaces */ \
- NXUngetc(formatStream); /* but put that non-space back! */ \
- for (i = 0; i < 1024 && (s[i]=NXGetc(formatStream)) != '\n'; i++) \
- ; /* everything up to newline */ \
- s[i] = (char) NULL;
-
- #define READ_STRING_AND_FLOAT(s, x) \
- if (cautious_read(formatStream) != 0) return self; \
- while (NXGetc(formatStream) == ' ') \
- ; \
- NXUngetc(formatStream); \
- (void) NXScanf(formatStream, "%s %f", s, &x); /* font and size */
-
- - readFormatData:(NXStream *)formatStream
- {
- char string[1024];
- double d1, d2, d3;
- float f1;
- int i, j, ncurves, curveno, linetype, symtype;
- NXPoint point;
- NXRect windowframe;
- float r, g, b, a;
- NXColor aColor;
-
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%lf %lf %lf\n", &d1, &d2, &d3);
- [plotParam resetXmin:d1];
- [plotParam resetXmax:d2];
- [plotParam resetXinc:d3];
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%lf %lf %lf\n", &d1, &d2, &d3);
- [plotParam resetYmin:d1];
- [plotParam resetYmax:d2];
- [plotParam resetYinc:d3];
-
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%s\n", string);
- if (!strncmp(string, "log", 3))
- [plotParam forceXaxisLog];
- else
- [plotParam forceXaxisLinear];
-
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%s\n", string);
- if (!strncmp(string, "log", 3))
- [plotParam forceYaxisLog];
- else
- [plotParam forceYaxisLinear];
-
- // Main title:
- READ_STRING(string);
- [mainTitle setStringValue:string at:0];
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceMainTitleFont:string :f1];
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f\n", &point.x, &point.y); /* maintitlebox */
- [canvas forceMainTitleBoxOrigin:point];
-
- // X title:
- READ_STRING(string);
- [xTitle setStringValue:string at:0];
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceXTitleFont:string :f1];
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f\n", &point.x, &point.y); /* xtitlebox */
- [canvas forceXTitleBoxOrigin:point];
-
- // Y title:
- READ_STRING(string);
- [yTitle setStringValue:string at:0];
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceYTitleFont:string :f1];
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f\n", &point.x, &point.y); /* ytitlebox */
- [canvas forceYTitleBoxOrigin:point];
-
- // Legend on/off:
- READ_ONE_INT(i);
- [legendOnOff setState:i];
-
- // Legend Box on/off:
- READ_ONE_INT(i);
- [legendBoxOnOff setState:i];
-
- // Legend title:
- READ_STRING(string);
- [legendTitle setStringValue:string at:0];
-
- // Legend title font and size:
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceLegendTitleFont:string :f1];
-
- // Legend font:
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceLegendFont:string :f1];
-
- // Curves: No., line type, symbol type, colors, title
- READ_ONE_INT(ncurves);
- while (NXGetc(formatStream) != '\n')
- ;
- for (i = 0; i < ncurves; i++) {
- NXScanf(formatStream, "%d %d %d", &curveno, &linetype, &symtype);
- NXScanf(formatStream, "%f %f %f %f", &r, &g, &b, &a);
- aColor = NXConvertRGBAToColor(r, g, b, a);
- while (NXGetc(formatStream) == ' ')
- ;
- NXUngetc(formatStream);
- for (j = 0; j < 1024 && (string[j]=NXGetc(formatStream)) != '\n'; j++)
- ; /* everything up to newline */
- string[j] = (char) NULL;
- [legendForm setStringValue:string at:i];
- [plotParam makeLineStyle:i :linetype];
- [plotParam makeSymbolType:i :symtype];
- [plotParam forceCurveColor:i :aColor];
- [plotParam adjustLineStyleMatrix:i :linetype];
- [plotParam adjustSymbolTypeMatrix:i :symtype];
- if (i==0)
- [curveColorWell setColor:aColor];
- }
- [plotParam redisplayLineStyleMatrix];
- [plotParam redisplaySymbolTypeMatrix];
- [curveNumber setIntValue:1]; /* the text field next to the curve color well */
-
- // Thickness:
- READ_ONE_FLOAT(f1);
- [lineThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [lineThicknessText setFloatValue:ABS(f1)];
-
- // Symbol size:
- READ_ONE_FLOAT(f1);
- [symbolSize setFloatValue:ABS(f1)]; /* message slider and text field */
- [symbolSizeText setFloatValue:ABS(f1)];
-
- // Grid on/off, dotted, and thickness:
- READ_ONE_INT(i);
- [gridOnOff setState:i];
- // Here is where the "new" (version 1.7) format file begins to differ
- // from the "old" (1.6); the new has "Grid dotted" here, the old has
- // "Border box thickness"
- //
- // Read in one character:
- i = NXGetc(formatStream);
- if (i == 'B') { /* old */
- NXRunAlertPanel("Format File Read",
- "Suspected \"old\" format file\n"
- "Doing the best I can...",
- "OK", NULL, NULL);
- //Border box thickness
- READ_ONE_FLOAT(f1);
- [borderBoxThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- //Axes on/off
- READ_ONE_INT(i);
- [axesOnOff setState:i];
- //Axis thickness
- READ_ONE_FLOAT(f1);
- [axisThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [axisThicknessText setFloatValue:ABS(f1)];
- //Tic label font and size
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceTicLabelFont:string :f1];
- //Tic mark length
- READ_ONE_FLOAT(f1);
- [ticMarkLength setFloatValue:f1]; /* message slider and text field */
- [ticMarkLengthText setFloatValue:f1];
- //Minor tic marks on/off
- READ_ONE_INT(i);
- [minorTicMarksOnOff setState:i];
- }
- else { /* new */
- READ_ONE_INT(i);
- [gridDotted setState:i];
- READ_ONE_FLOAT(f1);
- [gridThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [gridThicknessText setFloatValue:ABS(f1)];
-
- // Border box on/off and thickness:
- READ_ONE_INT(i);
- [borderBoxOnOff setState:i];
- READ_ONE_FLOAT(f1);
- [borderBoxThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [borderBoxThicknessText setFloatValue:ABS(f1)];
-
- // Frame box on/off and thickness:
- READ_ONE_INT(i);
- [frameBoxOnOff setState:i];
- READ_ONE_FLOAT(f1);
- [frameBoxThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [frameBoxThicknessText setFloatValue:ABS(f1)];
-
- // Axes on/off and thickness:
- READ_ONE_INT(i);
- [axesOnOff setState:i];
- READ_ONE_FLOAT(f1);
- [axisThickness setFloatValue:ABS(f1)]; /* message slider and text field */
- [axisThicknessText setFloatValue:ABS(f1)];
-
- // Tic label font and size:
- READ_STRING_AND_FLOAT(string, f1);
- [canvas forceTicLabelFont:string :f1];
-
- // Major tic marks on/off:
- READ_ONE_INT(i);
- [majorTicMarksOnOff setState:i];
-
- // Minor tic marks on/off:
- READ_ONE_INT(i);
- [minorTicMarksOnOff setState:i];
-
- // Tic mark length:
- READ_ONE_FLOAT(f1);
- [ticMarkLength setFloatValue:f1]; /* message slider and text field */
- [ticMarkLengthText setFloatValue:f1];
-
- // Tic mark thickness:
- READ_ONE_FLOAT(f1);
- [ticMarkThickness setFloatValue:f1]; /* message slider and text field */
- [ticMarkThicknessText setFloatValue:f1];
-
- // Tic mark location: 0=axes, 1=frame (2 sides), 2=frame (4 sides)
- READ_ONE_INT(i);
- if (i==0)
- [ticMarkLocation setTitle:"Axes"];
- else if (i==1)
- [ticMarkLocation setTitle:"Frame (2 sides)"];
- else
- [ticMarkLocation setTitle:"Frame (4 sides)"];
- }
- // Legend Box origin:
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f\n", &point.x, &point.y);
- [canvas forceLegendBoxOrigin:point];
-
- // Window origin and size:
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f %f %f\n", &windowframe.origin.x,
- &windowframe.origin.y, &windowframe.size.width,
- &windowframe.size.height);
- [canvas forceWindowFrame:&windowframe];
-
- // Text color and background color:
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f %f %f\n", &r, &g, &b, &a);
- aColor = NXConvertRGBAToColor(r, g, b, a);
- [plotParam forceTextColor:aColor];
- [textColorWell setColor:aColor];
- if (cautious_read(formatStream) != 0) return self;
- (void) NXScanf(formatStream, "%f %f %f %f\n", &r, &g, &b, &a);
- aColor = NXConvertRGBAToColor(r, g, b, a);
- [plotParam forceBackgroundColor:aColor];
- [backgroundColorWell setColor:aColor];
- NXPing();
-
- // Following is new for error bars:
- // Error bar base width
- READ_ONE_FLOAT(f1);
- [ebarBaseWidth setFloatValue:f1]; /* message slider and text field */
- [ebarBaseWidthText setFloatValue:f1];
- NXPing();
-
- // Following is new (should go with legend material above this,
- // but would be impossible to achieve backward compatibility of
- // format files.
- READ_ONE_INT(i);
- [legendOpaque setState:i];
-
- return self;
- }
-
- - getOpenFileName:(char *)name
- {
- static const char *const fileTypes[2] = {NULL, NULL};
- id openPanel = [[OpenPanel new] allowMultipleFiles:NO];
-
- [openPanel setAccessoryView:nil]; /* may have to clean out an accessory view */
- [openPanel setTitle:"Open"]; /* make sure title is OK (cf. binary open) */
- if ([openPanel runModalForTypes:fileTypes]) {
- strncpy(name, [openPanel filename], 1024);
- }
- return self;
- }
-
- - getSaveFileName:(char *)name
- {
- id savePanel = [[SavePanel new] setRequiredFileType:""];
-
- [savePanel setTitle:"Save Format"]; /* make sure title is correct */
- if ([savePanel runModal]) {
- strncpy(name, [savePanel filename], 1024);
- }
- return self;
- }
-
- - writeFormatFile:sender
- {
- char fname[1024];
- NXStream *formatStream;
-
- // Get a filename:
- [self getSaveFileName:fname];
- // Get a stream:
- if ((formatStream = NXOpenMemory(NULL, 0, NX_WRITEONLY)) == NULL) {
- NXRunAlertPanel("Write Format", "Cannot open memory for %s",
- "OK", NULL, NULL, fname);
- return self;
- }
- // Write the data:
- [self writeFormatData:formatStream];
-
- // Save the file which was memory-mapped:
- NXFlush(formatStream);
- NXSaveToFile(formatStream, fname);
- NXClose(formatStream);
-
- return self;
- }
-
- - readFormatFile:sender
- {
- char fname[1024];
- NXStream *formatStream;
-
- // Get a filename:
- [self getOpenFileName:fname];
- // Get a stream:
- if ((formatStream = NXMapFile(fname, NX_READONLY)) == NULL) {
- return self;
- }
- // Read the data:
- [self readFormatData:formatStream];
-
- // Redraw automatically:
- [plotParam drawPlot:self];
- return self;
- }
-
-
- @end
-